#include <iostream>
#include <vector>
#include <unordered_map>
#include <algorithm>

using namespace std;
const int N = 300010; //n次插入和m次查询相关数据量的上界
int n, m;
int a[N];//存储坐标插入的值
int s[N];//存储数组a的前缀和
vector<int> alls;  //存储（所有与插入和查询有关的）坐标
vector<pair<int, int>> add, query; //存储插入和询问操作的数据
unordered_map<int,int> mp; //哈希表

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cout.tie(0);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) {
        int x, c;
        cin >> x >> c;
        add.push_back({x, c});
        alls.push_back(x);
    }
    for (int i = 1; i <= m; i++) {
        int l , r;
        cin >> l >> r;
        query.push_back({l, r});
        alls.push_back(l);
        alls.push_back(r);
    }
    //先排序，后去重
    sort(alls.begin(), alls.end());
    alls.erase(unique(alls.begin(), alls.end()), alls.end());
    //将待离散化的值映射到下标
    int j=1;
    for(int i=0;i<alls.size();i++)
    {
        mp[alls[i]]=j++;//映射到下标从1开始
    }
    //执行前n次插入操作
    for (auto item : add) {
        int x = mp[item.first];//找到离散化后的小下标
        a[x] += item.second;//将数组中离散化后的小下标位置加上数据
    }
    //前缀和
    for (int i = 1; i <= alls.size(); i++) s[i] = s[i-1] + a[i];
    //处理后m次询问操作
    for (auto item : query) {
        int l = mp[item.first];//找到区间的左端点
        int r = mp[item.second];//找到区间的右端点
        cout << s[r]-s[l-1] << "\n";
    }

    return 0;
}